import pandas as pd
import numpy as np


def clean_dangdang_data(input_file, output_file):
    """
    当当网数据清洗函数
    :param input_file: 输入CSV文件路径
    :param output_file: 输出CSV文件路径
    """
    # 1. 读取数据
    df = pd.read_csv(input_file, encoding='utf-8-sig')
    print("===== 原始数据概览 =====")
    print(f"总记录数: {len(df)}")
    print("\n前5条数据:")
    print(df.head())
    print("\n数据信息:")
    print(df.info())

    # 2. 数据清洗
    # 复制原始数据避免SettingWithCopyWarning
    df_clean = df.copy()

    # 2.1 缺失值处理
    print("\n===== 缺失值处理 =====")
    print("缺失值统计:")
    print(df_clean.isnull().sum())

    # 使用字典方式填充缺失值，避免inplace警告
    df_clean = df_clean.assign(
        作者=df_clean['作者'].fillna('未知'),
        出版社=df_clean['出版社'].fillna('未知'),
        评论数=pd.to_numeric(df_clean['评论数'].replace('', '0'), errors='coerce').fillna(0).astype(int)
    )

    # 2.2 异常值处理
    print("\n===== 异常值处理 =====")

    # 价格处理 - 转换为数值型
    df_clean['价格'] = pd.to_numeric(df_clean['价格'].str.replace('¥', ''), errors='coerce')

    # 计算价格异常值范围
    price_stats = df_clean['价格'].describe()
    Q1 = price_stats['25%']
    Q3 = price_stats['75%']
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR

    print(f"价格异常值范围: < {lower_bound:.2f} 或 > {upper_bound:.2f}")
    outliers = df_clean[(df_clean['价格'] < lower_bound) | (df_clean['价格'] > upper_bound)]
    print(f"找到 {len(outliers)} 条价格异常记录")

    # 使用中位数替换异常值
    price_median = df_clean['价格'].median()
    df_clean['价格'] = np.where(
        (df_clean['价格'] < lower_bound) | (df_clean['价格'] > upper_bound) | df_clean['价格'].isna(),
        price_median,
        df_clean['价格']
    )

    # 2.3 重复数据处理
    print("\n===== 重复数据处理 =====")
    print(f"原始数据记录数: {len(df_clean)}")

    # 基于关键字段判断重复
    dup_mask = df_clean.duplicated(subset=['书名', '作者', '出版社'], keep='first')
    print(f"找到 {dup_mask.sum()} 条重复记录")

    # 删除重复记录
    df_clean = df_clean[~dup_mask].copy()
    print(f"去重后记录数: {len(df_clean)}")

    # 2.4 数据格式化
    print("\n===== 数据格式化 =====")

    # 价格格式化
    df_clean['价格'] = df_clean['价格'].round(2)

    # 文本字段清理
    text_cols = ['书名', '作者', '出版社']
    for col in text_cols:
        df_clean[col] = (
            df_clean[col]
            .str.strip()
            .str.replace(r'\s+', ' ', regex=True)
        )

    # 书名特殊字符处理
    df_clean['书名'] = df_clean['书名'].str.replace(r'[^\w\s\u4e00-\u9fff]', '', regex=True)

    # 重新生成序号
    df_clean = df_clean.reset_index(drop=True)
    df_clean['编号'] = df_clean.index + 1

    # 3. 保存清洗后的数据
    df_clean.to_csv(output_file, index=False, encoding='utf-8-sig')

    print("\n===== 清洗后数据概览 =====")
    print(df_clean.head())
    print(f"\n数据清洗完成，结果已保存到: {output_file}")
    print(f"原始记录数: {len(df)} | 清洗后记录数: {len(df_clean)}")

    return df_clean


# 使用示例
if __name__ == "__main__":
    input_csv = 'dangdang_books_minjian.csv'
    output_csv = 'dangdang_books_minjian_cleaned.csv'
    cleaned_data = clean_dangdang_data(input_csv, output_csv)